package cn.ipanel.bigdata.job

import cn.ipanel.bigdata.dw.ods.AbsOdsHive
import cn.ipanel.bigdata.dw.dwd.AbsDwdHive
import cn.ipanel.bigdata.job.ods.AbsOdsJob
import org.apache.spark.sql.DataFrame

/**
 * Author: lzz
 * Date: 2022/3/28 17:06
 */
package object dwd {

  abstract class AbsDwdJob extends AbsOdsJob {

    /**
     * 数据源，来自 ods 层表
     * @return
     */
    def optSourceTable: AbsOdsHive
    lazy val _S: AbsOdsHive = optSourceTable

    /**
     * 本任务数据存储目标表，必须是 dwd 层表
     *  @return
     */
    override def optTargetTable: AbsDwdHive
    override lazy val _T: AbsDwdHive = optTargetTable

    /**
     * 默认的 prepare 方法，先删除操作表的分区
     */
    override def source(): DataFrame = _S.find(_DAY, _RANGE)

    /**
     * 默认的 startup 方法，在 onPrepare 分发之后
     */
    override def onPrepare(): Unit = _T.drop(_DAY, _RANGE)

    /**
     * 计算方式：从数据源获取素具，intent处理（可能是清洗，聚合等），join用于从外部表补充字段，最后save
     */
    override def onStartup(): Unit = _T.save(_JOIN.join(_INTENT.intent(source(), _DAY), _DAY))
  }
}